# -*- coding: utf-8 -*-
"""
Author: Sun Jinyang
description: py3d 主界面

三个入口文件执行顺序是
    toolbar
    py3d
    minitoolbar

"""
import os
import sys

from PyQt5 import QtCore, QtGui, QtWidgets

import gui.controls.globalvar as GL
import gui.controls.settings as ST
import gui.controls.signals as SG
import gui.controls.docks as docks
import gui.controls.plugins as plugins
import gui.components.qss as qss
import gui.controls.apis as apis
import gui.components.utils as utils
import gui.components.message_box as MBox
import vtk

vtk.vtkObject.GlobalWarningDisplayOff()


class Ui_py3d(object):
    def __init__(self, *args, **kwargs):
        """
        初始化时进行授权验证
        """
        try:
            if not os.path.exists("license_verify.pyc"):
                MBox.warning("解密文件不存在,请联系软件提供商,重新获取！！！")
                raise Exception("解密文件不存在 ！！！")
            import license_verify as licenseVar

            license_file = "CopyRight_DALIANMINGYUNKEJI.lic"
            if not os.path.exists(license_file):
                MBox.warning("授权文件不存在,请联系软件提供商,重新获取 ！！！")
                raise Exception("授权文件不存在 ！！！")
            if licenseVar.HASH_VALUE != utils.hash_file(license_file):
                MBox.warning("授权文件已被非法修改,请联系软件提供商,重新获取 ！！！")
                raise Exception("授权文件已被非法修改,请联系软件提供商,重新获取 ！！！")
            # 判断当前日期是否已经超过授权日期
            if licenseVar.is_exceed():
                date = licenseVar.EXCEED_DATE
                MBox.warning(
                    f"软件授权已经过期 (截止日期为：“{date}”),请联系软件提供商,重新获取 ！！！"
                )
                raise Exception(
                    f"软件授权已经过期 (截止日期为：“{date}”),请联系软件提供商,重新获取 ！！！"
                )
            # 快要过期时给予提示 2天(截止日期当天和前一天)之内给予提示
            today = utils.get_date_later()
            value = utils.compare_date(
                today, utils.get_date_later(licenseVar.EXCEED_DATE, -1)
            )
            if value == 1 or value == 0:
                MBox.warning(
                    f"软件授权即将到期 (截止日期为：“{licenseVar.EXCEED_DATE}”),请及时联系软件提供商，获取最新授权 ！！！"
                )
        except:
            # utils.print_error()
            sys.exit(0)

        # QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) 报错 Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created.

    def setupUi(self, py3d):
        """主界面ui"""
        # 将py3d对象保存到全局变量中
        GL.set_value("py3d", py3d)
        # 初始化 qss 样式 先初始化因为后续要用到
        qss.init()
        # 初始化配置文件
        ST.init()
        # 初始化dock
        docks.init()

        # 初始化apps
        plugins.init()
        # 初始化界面显示信息
        self.__init(py3d)

        # 注意因为存在由系统调用的多个入口文件 而toobar就是一个入口文件且在py3d之前执行 所以在这里发送真正运行命令信号  同时菜单初始化等操作也在toolbar.py文件中执行
        SG.signals.sigStartRunToolbar.emit()

    def __init(self, py3d):
        """读取已经初始化好的配置文件，设置主界面配置信息"""
        cfgIndex = ST.get_index_data() or {}
        # 设置主程序窗口标题
        py3d.setWindowTitle(cfgIndex.get("windowTitle", "py3d"))
        # 设置主程序主题
        theme = cfgIndex.get("theme", "dark")  # dark or light
        themeOptions = cfgIndex.get("themeOptions", {})
        # 设置主程序主题
        useThemeSystem = themeOptions.get(
            "useThemeSystem", ""
        )  # "" or qdarkstyle or qdarktheme
        if theme == "dark":
            import qdarkstyle
            from qdarkstyle.light.palette import LightPalette
            from qdarkstyle.dark.palette import DarkPalette

            py3d.setStyleSheet(
                qdarkstyle.load_stylesheet(
                    qt_api="pyqt5",
                    palette=theme == "dark" and DarkPalette or LightPalette,
                )
            )

        elif theme == "light":

            from PyQt5.QtWidgets import QApplication
            import qtmodern.styles

            app = QApplication.instance()
            qtmodern.styles.light(app)  # 正确 - 内部会处理好样式设置
            # 应用自定义样式
            app.setStyleSheet(open("styles/qtmodern_light.qss", "r").read())

            ribbonbar = GL.get_value("ribbonbar")
            ribbonbar.setStyleSheet(open("styles/base_light.qss", "r").read())

        elif useThemeSystem == "qdarktheme":
            import qdarktheme

            print("theme", theme, themeOptions)
            qdarktheme.setup_theme(theme)
            # 覆盖背景为蓝色，字体为白色
            py3d.setStyleSheet(
                """
                QWidget {
                    color: #1E90FF;  /* 蓝色背景 */
                    background-color: white;               /* 白色字体 */
                }
            """
            )
            useThemeSystem = "qdarktheme"
            customColors = themeOptions.get("customColors", {})
            themeCustomColors = customColors.get(theme, {})
            if themeCustomColors:
                qdarktheme.setup_theme(custom_colors=themeCustomColors)

        # 设置是否隐藏view 的tabbar
        apis.hide_view_tab(cfgIndex.get("hideTabBar", False))
        # 设置视图的背景色
        self.init_config()

    def init_config(self):
        # 初始化 默认背景色
        self.timer = QtCore.QTimer()
        self.timer.setSingleShot(True)
        self.timer.timeout.connect(self.init_once)
        self.timer.start(10)

    def init_once(self, *args, **kwargs):
        # 设置视图的背景色
        cfgIndex = ST.get_index_data() or {}
        theme = cfgIndex.get("theme", "light")
        viewBackgroundColor = cfgIndex.get("viewBackgroundColor").get(
            theme, [[93, 212, 255], [255, 253, 218]]
        )
        apis.set_view_bgcolor(viewBackgroundColor)
        GL.set_value("showGridModel", cfgIndex.get("showGridModel", True))


from .images_rc import *

##  ============窗体测试程序 ================================
if __name__ == "__main__":  ##用于当前窗体测试
    pass
